home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1997 November & December / Amiga-CD 1997 #11-12.iso / amiga-internet-seiten / magazin / a05-97 / pos_xmpl.c < prev    next >
C/C++ Source or Header  |  1997-05-23  |  14KB  |  382 lines

  1. /* Example.c: © Copyright Michael Christoph, proDAD, 09.02.1997 */
  2.  
  3. // Tags PLACETEXT_ABOVE und PLACETEXT_IN werden von pOS nicht beachtet
  4.  
  5. #include <exec/types.h>
  6. #include <intuition/intuition.h>
  7. #include <libraries/gadtools.h>
  8. #include <libraries/asl.h>
  9. #include <clib/exec_protos.h>
  10. #include <clib/dos_protos.h>
  11. #include <clib/intuition_protos.h>
  12. #include <clib/gadtools_protos.h>
  13. #include <clib/asl_protos.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16.  
  17. #ifdef __pOS__
  18. #include <p:pIntui/Tags.h>
  19. #include <p:pIntui/EasyReq.h>
  20. #include <p:pIntui/EasyTags.h>
  21. #include <p:pGadget/GadItem.h>
  22. #include <p:proto/pList.h>
  23. #include <p:proto/pExec2.h>
  24. #include <p:proto/pIntui2.h>
  25. #endif
  26.  
  27. const UBYTE version[]="\0$VER: Example.c 1.00 ("__DATE2__") (© Feb.1997 by Michael Christoph)";
  28.  
  29. #ifdef __pOS__
  30. struct pOS_IntuiDevice *gb_IntuiBase;
  31. struct pOS_pSLBase     *gb_PSLBase;
  32. struct pOS_GfxBase     *gb_GfxBase;
  33. struct pOS_UtilityBase *gb_UtilityBase;   /*** wird fast immer benötigt ***/ #else
  34. struct IntuitionBase   *IntuitionBase;
  35. struct Library         *GadToolsBase;
  36. struct Library         *AslBase;
  37. #endif
  38.  
  39. UBYTE *LVTexte[]={ "Normal", "Rückfrage", "Warnung", "Fehler" };
  40.  
  41. #ifdef __pOS__
  42.   struct pOS_MemPool MemPool;
  43.   struct pOS_List    Gad1List;
  44. #else
  45.   extern struct MinList Gad1List;
  46.   struct Node Gad1Nodes[]={
  47.     &Gad1Nodes[1], (struct Node *)&Gad1List.mlh_Head, 0, 0, LVTexte[0],
  48.     &Gad1Nodes[2], &Gad1Nodes[0], 0, 0, LVTexte[1],
  49.     &Gad1Nodes[3], &Gad1Nodes[1], 0, 0, LVTexte[2],
  50.     (struct Node *)&Gad1List.mlh_Tail, &Gad1Nodes[2], 0, 0, LVTexte[3] };
  51.   struct MinList Gad1List={ (struct MinNode *)&Gad1Nodes[0],NULL,(struct MinNode *)&Gad1Nodes[2] }; #endif
  52.  
  53. /******************************************************************************/
  54.  
  55. void OpenEasyRequester(struct Window *win, ULONG reqtyp, STRPTR text, STRPTR file) {
  56. #ifdef __pOS__
  57.   /*** bei Typ=0 die ausgewählte Grafik anzeigen, sonst den typenspezifisch voreingestellte Grafik ***/
  58.   ULONG reqtypen[]={ ESYTYP_Std, ESYTYP_Request,ESYTYP_Warn,ESYTYP_Error };
  59.   struct pOS_TagItem taglist[]={ TAG_IGNORE,(ULONG)file, TAG_DONE };
  60.   ULONG args[]={ (ULONG)text, (ULONG)file };
  61.   struct pOS_EasyStruct easy={ sizeof(struct pOS_EasyStruct),0,reqtypen[reqtyp],LVTexte[reqtyp],"Text: %.60s\nDatei: %.60s","_Ok",NULL,NULL,(pOS_TagItem *)&taglist };
  62.  
  63.   if(reqtyp==0) taglist[0].ti_Tag=(ULONG)EASYTAG_GfxFile;
  64.   pOS_EasyRequestArgs((struct pOS_Window *)win,&easy,NULL,(ULONG*)&args); #else
  65.   struct EasyStruct easy={ sizeof(struct EasyStruct),0,LVTexte[reqtyp],"Text: %.60s\nDatei: %.60s","Ok" };
  66.   EasyRequest(win,&easy,NULL,text,file); #endif
  67. }
  68.  
  69. /******************************************************************************/
  70.  
  71. void OpenFileRequester(struct Screen *scr, STRPTR buffer) {
  72.   struct FileRequester *fr;
  73.   if((fr=(struct FileRequester *) AllocAslRequestTags(ASL_FileRequest,
  74.       ASLFR_Screen,          scr,
  75.       ASLFR_TitleText,       "Grafik-Datei auswählen ...", #ifdef __pOS__
  76.       ASLFR_InitialDrawer,   buffer,  /*** wird automatisch in Schublade und Datei getrennt ***/ #else
  77.       ASLFR_InitialDrawer,   "",
  78.       ASLFR_InitialFile,     buffer,  /*** Daten müssten in Verzeichnis- und Dateiteil zerlegt werden ***/ #endif
  79.       ASLFR_InitialPattern,  "#?.pic",
  80.       ASLFR_RejectIcons,     TRUE,
  81.       ASLFR_DoPatterns,      TRUE,
  82.       TAG_DONE)))
  83.   {
  84.     if(AslRequest(fr,NULL))
  85.     {
  86.       strcpy(buffer,fr->fr_Drawer);
  87.       AddPart(buffer,fr->fr_File,299);
  88.     }
  89.     // else "zuwenig Speicher" oder "Abbruch" angeklickt
  90.   }
  91. }
  92.  
  93. /******************************************************************************/
  94.  
  95. void RunningExample(struct Screen *scr, APTR visualInfo) {
  96.   struct Window   *win;
  97.   struct Gadget   *gads[4];
  98.   struct Gadget   *gadlist=NULL;
  99.   struct Gadget   *gadget=CreateContext(&gadlist);
  100.   struct NewGadget ng={ 0 };
  101. #ifdef __pOS__
  102.   const UWORD      titleheight=scr->WBorTop+scr->RastPort->Font->tf_YSize;
  103.   struct pOS_GadgetItem *gaditem;
  104.   ULONG i;
  105. #else
  106.   struct TextAttr  topaz8={ "topaz.font",8,FS_NORMAL,FPF_ROMFONT };
  107.   /*** Höhe des Fenstertitels, je nach Font,  berechnen ***/
  108.   const UWORD      titleheight=scr->WBorTop+scr->Font->ta_YSize+1; #endif
  109.  
  110.   ng.ng_VisualInfo=visualInfo;
  111. #ifndef __pOS__
  112.   /*** Font-Eintrag in den "Amiga"-Gadgets wird ignoriert ***/
  113.   ng.ng_TextAttr=scr->Font;
  114. #endif
  115.  
  116. #ifdef __pOS__
  117.   /*** Listen-Einträge sind unter pOS IntuiObjecte. Sie sind etwas aufwendiger ***/
  118.   /*** zu erzeugen, jedoch wesentlich flexibler ***/
  119.   pOS_ListInit(&Gad1List);
  120.   pOS_InitMemPool(&MemPool,4096,MEMF_PUBLIC);
  121.  
  122.   for(i=0; i<4; ++i)
  123.   {
  124.     if((gaditem=(struct pOS_GadgetItem *) pOS_AllocPoolMem(&MemPool,
  125.              sizeof(struct pOS_GadgetItem),MEMF_CLEAR)))
  126.     {
  127.       struct pOS_IntuiObj *obj;
  128.       gaditem->gdt_ID=i;
  129.  
  130.       if((obj=(pOS_IntuiObj *) pOS_NewIObject(NULL,"itext.class",0,
  131.     ICLTAG_DrawInfo,      visualInfo,
  132.     IOBJTAG_StaticString, LVTexte[i],  /*** String wird nicht kopiert ***/
  133.     TAG_END)))
  134.       {
  135.     gaditem->gdt_Render=obj;
  136.     pOS_ListAddTail(&Gad1List,&gaditem->gdt_Node);
  137.       }
  138.       else printf("FEHLER: erzeugen von ListView-Eintrag schlug fehl.\n");
  139.     }
  140.     else printf("FEHLER: Speichermangel.\n");
  141.   }
  142.  
  143.   gads[0]=pOS_NewIObject(NULL,"lvgad.class",0,  /*** Name: scr->scr_DrawInfo->dri_Names[SCRNAM_GLVClass] ***/
  144.           ICLTAG_Left,           17,
  145.           ICLTAG_Top,            18+titleheight,
  146.           ICLTAG_Width,          204,
  147.           ICLTAG_Height,         64,
  148.           ICLTAG_DrawInfo,       visualInfo,
  149.           ICLTAG_ID,             1,
  150.           ICLTAG_RelVerify,      TRUE,
  151.           LVGADTAG_List,         &Gad1List,
  152.           //LVGADTAG_VAutoGad,     TRUE,  /*** rechts Schieber anzeigen ***/
  153.           LVGADTAG_CursorScroll, TRUE,
  154.           LVGADTAG_CursorSelect, TRUE,    /*** Eintrag kann über Pfeiltasten gewählt werden ***/
  155.           LVGADTAG_Key1,         TRUE,
  156.           LVGADTAG_AlwaysOne,    TRUE,
  157.           ICLTAG_AutoDelete,     TRUE);   /*** löscht sich selbständig am Ende ***/ #else
  158.   /*** für ListView-Gadget gibt es keine "Amiga"-Umsetzung ***/
  159.   ng.ng_LeftEdge  =17;
  160.   ng.ng_TopEdge   =18+titleheight;
  161.   ng.ng_Width     =204;
  162.   ng.ng_Height    =70;
  163.   ng.ng_GadgetText="Requester-Typen";
  164.   ng.ng_GadgetID  =1;
  165.   ng.ng_Flags     =PLACETEXT_ABOVE;
  166.   gads[0]=gadget=CreateGadget(LISTVIEW_KIND,gadget,&ng, GT_Underscore,'_', GTLV_Labels,&Gad1List, GTLV_ShowSelected,NULL, TAG_END); #endif
  167.  
  168.   ng.ng_LeftEdge  =240;
  169.   ng.ng_TopEdge   =18+titleheight;
  170.   ng.ng_Width     =143;
  171.   ng.ng_Height    =16;
  172.   ng.ng_GadgetText="Requester-_Text";  /*** wird unter pOS momentan nicht übernommen ***/
  173.   ng.ng_GadgetID  =2;
  174.   ng.ng_Flags     =PLACETEXT_ABOVE;
  175.   gads[1]=gadget=CreateGadget(STRING_KIND,gadget,&ng, GT_Underscore,'_', GTST_String,"Hello World", TAG_END);
  176.  
  177.   ng.ng_LeftEdge  =240;
  178.   ng.ng_TopEdge   =38+titleheight;
  179.   ng.ng_Width     =143;
  180.   ng.ng_Height    =18;
  181.   ng.ng_GadgetText="_Easy-Requester";
  182.   ng.ng_GadgetID  =3;
  183.   ng.ng_Flags     =PLACETEXT_IN;
  184.   gads[2]=gadget=CreateGadget(BUTTON_KIND,gadget,&ng, GT_Underscore,'_',TAG_END);
  185.  
  186.   ng.ng_LeftEdge  =240;
  187.   ng.ng_TopEdge   =64+titleheight;
  188.   ng.ng_Width     =143;
  189.   ng.ng_Height    =18;
  190.   ng.ng_GadgetText="_File-Requester";
  191.   ng.ng_GadgetID  =4;
  192.   ng.ng_Flags     =PLACETEXT_IN;
  193.   gads[3]=gadget=CreateGadget(BUTTON_KIND,gadget,&ng, GT_Underscore,'_',TAG_END);
  194.  
  195.   if(gadlist && gads[0] && gads[1] && gads[2] && gads[3])
  196.   {
  197.     /*** unter pOS muß das Fenster vom Typ SIMPLE_REFRESH sein !!! ***/
  198.     if((win=OpenWindowTags(NULL,
  199.       WA_Left,10, WA_Top,14, WA_Width,400, WA_Height,92+titleheight, #ifdef __pOS__
  200.       WA_IDCMP,       IDCMP_CloseWindow | IDCMP_RefreshWindow | IDCMP_StdSysMsg, #else
  201.       WA_IDCMP,       IDCMP_GADGETUP|IDCMP_CLOSEWINDOW|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW, #endif
  202.       WA_Flags,       WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SIMPLE_REFRESH|WFLG_ACTIVATE, #ifdef __pOS__
  203.       WA_Title,       "pOS - Example",
  204.       WA_ScreenTitle, "Programming Example · pOS-Version by Michael Christoph, proDAD (Feb.1997)",
  205.       SCRTAG_AutoSizeGadget,gads[0],   /*** pOS-ListView kann automatisch eingehängt werden ***/ #else
  206.       WA_Title,       "Amiga - Example",
  207.       WA_ScreenTitle, "Programming Example · Amiga-Version by Michael Christoph, proDAD (Feb.1997)",
  208.       WA_Gadgets,     gadlist,
  209. #endif
  210.       WA_CustomScreen,scr,
  211.       TAG_DONE)))
  212.     {
  213.       BOOL running=TRUE;
  214.       UWORD selectid=0;
  215.       static UBYTE fileBuffer[300]="ENV:SysGfx/ReqIcn.pic";
  216.  
  217. #ifdef __pOS__
  218.       /*** "Amiga"-Gadgets dürfen erst nach dem Fenster öffnen eingehängt werden !!! ***/
  219.       AddGList(win,gadlist,~0,~0,NULL); #endif
  220.       GT_RefreshWindow(win,NULL);
  221.       RefreshGList(gadlist,win,NULL,5);  /*** Context-Gadget unter pOS mitzählen !!! ***/
  222.  
  223.       /*** ersten Eintrag selektieren (Amiga: Eintragnummer; pOS: Adresse von Eintrag) ***/ #ifdef __pOS__
  224.       pOS_SetGadgetAttrs((struct pOS_Window *)win,(struct pOS_Gadget *)gads[0],LVGADTAG_SelectItem,Gad1List.lh_Head,TAG_DONE); #else
  225.       GT_SetGadgetAttrs(gads[0],win,NULL,GTLV_Selected,0,TAG_DONE); #endif
  226.  
  227.       /*** Schleife bis Fenster geschlossen wird ***/
  228.       while(running)
  229.       {
  230.     struct IntuiMessage *msg;
  231.  
  232.     Wait(1L << win->UserPort->mp_SigBit);
  233.     while((msg=GT_GetIMsg(win->UserPort)))
  234.     {
  235.       switch(msg->Class)
  236.       {
  237.         case IDCMP_REFRESHWINDOW:
  238.          GT_BeginRefresh(win);
  239.          /*** hier eigene Fensterinhalte neuzeichnen ***/
  240.          GT_EndRefresh(win,TRUE);
  241.          break;
  242.  
  243.         case IDCMP_CLOSEWINDOW:
  244.          running=FALSE;
  245.          break;
  246.  
  247.         case IDCMP_VANILLAKEY:
  248.          switch(msg->Code)
  249.          {
  250.            case 't': case 'T':
  251.                  ActivateGadget(gads[1],win,NULL);
  252.                  break;
  253. #ifndef __pOS__
  254.            /*** unter pOS werden die Shortcuts als GADGETUP gesendet ! ***/
  255.            case 'e': case 'E':
  256.                  OpenEasyRequester(win,selectid,(((struct StringInfo *)gads[1]->SpecialInfo)->Buffer),fileBuffer);
  257.                  break;
  258.            case 'f': case 'F':
  259.                  OpenFileRequester(scr,fileBuffer);
  260.                  break;
  261. #endif
  262.          }
  263.          break;
  264.  
  265.         case IDCMP_GADGETUP:
  266.          switch(((struct Gadget *)msg->IAddress)->GadgetID)
  267.          {
  268.            case 1: /* Listview: Requester-Typen */ #ifdef __pOS__
  269.                pOS_GetGadgetAttr((struct pOS_Window *)win,(struct pOS_Gadget *)gads[0],LVGADTAG_SelectItem,(ULONG*)&gaditem);
  270.                selectid=gaditem ? gaditem->gdt_ID : 0; #else
  271.                selectid=msg->Code; #endif
  272.                break;
  273.            case 2: /* String: Requester-Text */
  274.                break;
  275.            case 3: /* Button: Easy-Requester */
  276.                OpenEasyRequester(win,selectid,(((struct StringInfo *)gads[1]->SpecialInfo)->Buffer),fileBuffer);
  277.                break;
  278.            case 4: /* Button: File-Requester */
  279.                OpenFileRequester(scr,fileBuffer);
  280.                break;
  281.          }
  282.          break;
  283.       }
  284.  
  285.       /*** Nachricht erst dann zurückschicken, wenn auf keine Zeiger daraus mehr zurückgegriffen wird ***/
  286.       GT_ReplyIMsg(msg);
  287.     }
  288.       }
  289.  
  290. #ifdef __pOS__
  291.       /*** "Amiga"-Gadgets selber entfernen ***/
  292.       RemoveGList(win,gadlist,~0);
  293. #endif
  294.       CloseWindow(win);
  295.     }
  296.     else printf("FEHLER: öffnen des Fensters fehlgeschlagen.\n");
  297.     FreeGadgets(gadlist);   /*** pOS-Gadget entfernt und löscht sich selbständig ***/
  298.   }
  299.   else printf("FEHLER: Gadgets konnten nicht erstellt werden.\n");
  300.  
  301. #ifdef __pOS__
  302.   /*** Listen-Einträge entfernen und MemoryPool freigeben ***/
  303.   while((gaditem=(struct pOS_GadgetItem *) pOS_ListRemHead(&Gad1List)))
  304.     if(gaditem->gdt_Render) pOS_DisposeIObject(gaditem->gdt_Render);
  305.   pOS_FreePoolAll(&MemPool);
  306. #endif
  307. }
  308.  
  309. /******************************************************************************/
  310.  
  311. void main(void)
  312. {
  313.  
  314.   LONG args[1]={ 0 };
  315.   struct RDArgs *rda;
  316.   if((rda=ReadArgs("PUBSCREEN/K",args,NULL)))
  317.   {
  318.  
  319. #ifdef __pOS__
  320.     if((gb_IntuiBase=(struct pOS_IntuiDevice *) pOS_OpenLibrary("pIntui.library",0)))
  321.     {
  322.       if((gb_PSLBase=(struct pOS_pSLBase *) pOS_OpenLibrary("pSl.library",0)))
  323.       {
  324.     if((gb_GfxBase=(struct pOS_GfxBase *) pOS_OpenLibrary("pGraphics.library",0)))
  325.     {
  326.       if((gb_UtilityBase=(struct pOS_UtilityBase *) pOS_OpenLibrary("pUtility.library",0)))
  327.       {
  328. #else
  329.     if((IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",37)))
  330.     {
  331.       if((GadToolsBase=OpenLibrary("gadtools.library",37)))
  332.       {
  333.     if((AslBase=OpenLibrary("asl.library",37)))
  334.     {
  335. #endif
  336.       struct Screen *scr;
  337.       APTR           visualInfo;
  338.  
  339.       if((scr=LockPubScreen(args[0] ? (STRPTR)args[0] : NULL)))
  340.       {
  341.         if((visualInfo=GetVisualInfo(scr,TAG_DONE)))
  342.         {
  343.           RunningExample(scr,visualInfo);
  344.  
  345.           FreeVisualInfo(visualInfo);
  346.         }
  347.         else printf("FEHLER: VisualInfo von Screen nicht ermittelbar.\n");
  348.         UnlockPubScreen(NULL,scr);
  349.       }
  350.       else printf("FEHLER: Pubscreen nicht ermittelbar.\n");
  351.  
  352. #ifdef __pOS__
  353.         pOS_CloseLibrary((struct pOS_Library *)gb_UtilityBase);
  354.       }
  355.       else printf("FEHLER: öffnen pUtility.library fehlgeschlagen.\n");
  356.       pOS_CloseLibrary((struct pOS_Library *)gb_GfxBase);
  357.     }
  358.     else printf("FEHLER: öffnen pGraphics.library V37 fehlgeschlagen.\n");
  359.     pOS_CloseLibrary((struct pOS_Library *)gb_PSLBase);
  360.       }
  361.       else printf("FEHLER: öffnen pSl.library V37 fehlgeschlagen.\n");
  362.       pOS_CloseLibrary((struct pOS_Library *)gb_IntuiBase);
  363.     }
  364.     else printf("FEHLER: öffnen pIntui.library V37 fehlgeschlagen.\n"); #else
  365.       CloseLibrary(AslBase);
  366.     }
  367.     else printf("FEHLER: öffnen asl.library V37 fehlgeschlagen.\n");
  368.     CloseLibrary(GadToolsBase);
  369.       }
  370.       else printf("FEHLER: öffnen gadtools.library V37 fehlgeschlagen.\n");
  371.       CloseLibrary((struct Library *)IntuitionBase);
  372.     }
  373.     else printf("FEHLER: öffnen intuition.library V37 fehlgeschlagen.\n"); #endif
  374.     FreeArgs(rda);
  375.   }
  376.   else printf("FEHLER: in den übergebenen Argumenten.\n"); }
  377.  
  378. /******************************************************************************/
  379.  
  380.  
  381.  
  382.